module dao.entity

// import db.sqlite
import time

@[table: 'word_memory_encode']
pub struct WordMemoryEncoding {
pub mut:
	// id 类型前要加? 表示可空(none), 因为在插入语句中（insert）, id 是自增的, 所以在插入时, id 是 none
	//如果不加？,当id被编译器设置默认值0,导致sql生成了一个id字段
	//所以要加? 表示可空, 避免生成默认值0的id字段
	//? 等价于rust编程语言中Option<T>类型, 可以是some(T),也可以是none
	//id ?int ,这样可以避免在插入(insert)时传递 ID 值
	//查询(select)时：返回的ID 会是 some(value)
	//访问id时：需要使用match匹配或解包来获取实际值
	//最佳实践：使用工厂方法创建对象时, 手动设置id为none,并设置某些字段默认值,简化创建对象的过程
	id ?int @[auto_increment: true; primary; sql_type: 'INTEGER'] // 自增主键

	encoding string
	word     string
	/*
		sqlite中函数CURRENT_TIME返的是UTC时间和我们东八区差8小时
		sqlite中函数CURRENT_TIMESTAMP 返的是UTC时间和我们东八区差8小时
		不设置默认值, 在创建对象时, 手动设置为当前时间
	*/
	// created_at  time.Time   @[default: 'CURRENT_TIME'; sql_type: 'timestamp']

	created_at string
	deleted_at ?string
	is_deleted bool @[default: false]
}

//封装 函数defautt_create（）参数
@[params]
pub struct WordMemoryEncodingArgs {
	pub mut:
	word string
	encoding string
}
// 工厂函数，确保 ID 为 none ,并设置某些字段默认值，简化创建对象的过程
pub fn defautt_create(obj WordMemoryEncodingArgs) WordMemoryEncoding {
	return WordMemoryEncoding{
		id: none
		word: obj.word
		encoding: obj.encoding
		created_at: time.now().format_ss()
		deleted_at: none
		is_deleted: false
	}
}

//在编译指令中添加编译参数 -autofree，才会在代码中插入free方法的调用 如： v -autofree run main.v
//free方法会在对象被销毁时调用，用于释放资源
//在一些特殊情况下，例如使用C库分配的内存，需要手动调用free方法来释放资源
fn (mut wme WordMemoryEncoding) free() {
	println('free word memory encoding: ${wme}')
}
